import { createBlocks, deepCopy, rotateBlock, mergeBlocks } from "./BlockUtils";

export const ROWS = 20, COLS = 10;

class PlayField {
  blocks = null;
  constructor() {
    this.blocks = createBlocks(ROWS, COLS);
  }

  // 校验是否超出边界
  isOutBound(tetris, offsetRow, offsetCol, rotate) {
    const tmpBlocks = deepCopy(tetris.blocks); // 复制一份方块，用于判定变化后是否有碰撞
    let { row: tr, col: tc } = tetris.position; // 取出当前方块的位置
    tr += offsetRow; // 加上偏移量
    tc += offsetCol; // 加上偏移量
    rotateBlock(tmpBlocks, rotate); // 旋转
    for(let row = 0; row < tmpBlocks.length; row++) { // 遍历
      const fr = tr + row; // 计算出当前方块的行
      if(fr < 0) continue; // 如果当前方块的行小于0，说明方块还未进入游戏区域，跳过
      for(let col = 0; col < tmpBlocks[row].length; col++) { // 遍历
        const fc = tc + col; // 计算出当前方块的位置
        if(tmpBlocks[row][col] // 如果当前存在方块
          && (fr >= ROWS || fc >= COLS || fc < 0 || this.blocks[fr][fc])){ // 并且当前位置超出或者当前位置已经有方块
            return true; // 返回true
          }
      }
    }
    return false; // 返回false
  }

  // 合并
  merge(tetris) {
    const { blocks: targetBlocks, position } = tetris; // 取出当前的tetris的blocks
    this.blocks = mergeBlocks(this.blocks, targetBlocks, position.row, position.col); // 合并
  }

  // 获取可消除的行
  getCanRemoveRows(from, to) {
    const canRemoveRows = []; // 可消除的行
    for(let row = from; row < Math.min(to, ROWS); row++) { // 遍历
      if(this.blocks[row].every(block => !!block)) { // 如果当前行的所有方块都有值
        canRemoveRows.push(row); // 加入可消除的行
      }
    }
    return canRemoveRows; // 返回可消除的行
  }

  // 消除
  removeRows(lines) {
    lines.forEach((r, i) => {
      this.blocks.splice(r - i, 1); // 删除
    })
    this.blocks.unshift(...createBlocks(lines.length, COLS)); // 插入
  }

  // 重置
  reset() {
    this.blocks.forEach(row => row.fill(0))
  }
}

export default PlayField;